package com.hnchances.studentscoresystem.controller;

import com.hnchances.studentscoresystem.dto.request.GradesDeleteDTO;
import com.hnchances.studentscoresystem.dto.request.GradesQueryDTO;
import com.hnchances.studentscoresystem.dto.request.GradesUpdateDTO;
import com.hnchances.studentscoresystem.dto.response.CommonResponse;
import com.hnchances.studentscoresystem.dto.response.GradesOperateResponse;
import com.hnchances.studentscoresystem.dto.response.GradesPageResponse;
import com.hnchances.studentscoresystem.entity.Grades;
import com.hnchances.studentscoresystem.service.GradesService;
import com.hnchances.studentscoresystem.service.UserService;
import com.hnchances.studentscoresystem.util.JwtUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 成绩管理控制器（核心）
 * 接口前缀：/grades
 * 鉴权规则：所有接口需登录，且仅老师有权限（学生无操作权限）
 * 严格遵循《实战测试.docx》3.4.6需求（成绩增删改查、分页、多条件查询）
 */
@Slf4j
@RestController
@RequestMapping("/grades")
public class GradesController {

    @Autowired
    private GradesService gradesService;

    @Autowired
    private UserService userService;

    @Autowired
    private JwtUtil jwtUtil;

    /**
     * 成绩新增（老师权限，仅可登记本班级成绩）
     * @param grades 成绩信息（含课程、考试、班级、学生ID及分数）
     * @param token 请求头中的Token（用于解析操作人信息）
     * @return 新增结果
     */
    @PostMapping("/add")
    public CommonResponse<GradesOperateResponse> addGrades(
            @RequestBody Grades grades,
            @RequestHeader("Authorization") String token) {
        log.info("成绩新增，classID: {}, studentID: {}, courseID: {}", 
                grades.getClassID(), grades.getStudentID(), grades.getCourseID());
        // 解析Token获取操作人信息（校验身份为老师）
        Long operatorId = jwtUtil.getUserIdFromToken(token);
        Integer operatorIdentity = jwtUtil.getIdentityFromToken(token);
        Integer operatorClassId = userService.getUserInfoByToken(token).getClassID();
        
        // 身份校验：仅老师可新增成绩
        if (operatorIdentity != 1) {
            return CommonResponse.fail(403, "仅老师有权限登记成绩");
        }
        
        // 调用Service执行新增（含班级权限校验）
        GradesOperateResponse response = gradesService.addGrades(grades, operatorId, operatorClassId);
        return CommonResponse.success(response, "成绩登记成功");
    }

    /**
     * 成绩查询（老师权限，仅可查本班级成绩，支持多条件+分页）
     * @param queryDTO 查询条件（学生姓名、班级、课程、考试等）
     * @param token 请求头中的Token（用于解析操作人信息）
     * @return 分页成绩列表
     */
    @PostMapping("/query")
    public CommonResponse<GradesPageResponse> queryGrades(
            @RequestBody GradesQueryDTO queryDTO,
            @RequestHeader("Authorization") String token) {
        log.info("成绩查询，条件：studentName={}, courseName={}", 
                queryDTO.getStudentName(), queryDTO.getCourseName());
        // 解析Token获取操作人信息
        Integer operatorIdentity = jwtUtil.getIdentityFromToken(token);
        Integer operatorClassId = userService.getUserInfoByToken(token).getClassID();
        
        // 调用Service执行查询（含权限过滤：老师仅查本班级）
        GradesPageResponse response = gradesService.queryGrades(queryDTO, operatorIdentity, operatorClassId);
        return CommonResponse.success(response, "成绩查询成功");
    }

    /**
     * 成绩修改（老师权限，仅可修改本班级成绩）
     * @param updateDTO 修改条件（含成绩ID、新分数等）
     * @param token 请求头中的Token（用于解析操作人信息）
     * @return 修改结果
     */
    @PostMapping("/update")
    public CommonResponse<GradesOperateResponse> updateGrades(
            @RequestBody GradesUpdateDTO updateDTO,
            @RequestHeader("Authorization") String token) {
        log.info("成绩修改，gradesId: {}", updateDTO.getGradesId());
        // 解析Token获取操作人信息（校验身份为老师）
        Long operatorId = jwtUtil.getUserIdFromToken(token);
        Integer operatorIdentity = jwtUtil.getIdentityFromToken(token);
        Integer operatorClassId = userService.getUserInfoByToken(token).getClassID();
        
        // 身份校验：仅老师可修改成绩
        if (operatorIdentity != 1) {
            return CommonResponse.fail(403, "仅老师有权限修改成绩");
        }
        
        // 调用Service执行修改（含班级权限校验）
        GradesOperateResponse response = gradesService.updateGrades(updateDTO, operatorId, operatorClassId);
        return CommonResponse.success(response, "成绩修改成功");
    }

    /**
     * 成绩删除（老师权限，仅可删除本班级成绩，软删除）
     * @param deleteDTO 删除条件（含成绩ID）
     * @param token 请求头中的Token（用于解析操作人信息）
     * @return 删除结果
     */
    @PostMapping("/del")
    public CommonResponse<GradesOperateResponse> deleteGrades(
            @RequestBody GradesDeleteDTO deleteDTO,
            @RequestHeader("Authorization") String token) {
        log.info("成绩删除，gradesId: {}", deleteDTO.getGradesId());
        // 解析Token获取操作人信息
        Integer operatorIdentity = jwtUtil.getIdentityFromToken(token);
        Integer operatorClassId = userService.getUserInfoByToken(token).getClassID();
        
        // 调用Service执行删除（含权限校验：学生无权限，老师仅删本班级）
        GradesOperateResponse response = gradesService.deleteGrades(deleteDTO, operatorIdentity, operatorClassId);
        return CommonResponse.success(response, "成绩删除成功");
    }
}